package com.snopy.concurrency.demo_base;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author
 * @description:
 * 等待/通知的经典范式,该范式分为两部分,分别针对等待方（消费者）和通知方（生产者）
 *  等待方遵循如下规则：
 *      1）获取对象的锁。
 *      2）如果条件不满足，则调用对象的wait()方法，如果被唤醒，仍要检查条件（虚假唤醒问题）
 *      3）条件满足则执行对应的逻辑
 *  通知方遵循如下原则：
 *      1）获取对象的锁
 *      2）改变条件
 *      3）通知所有等待在对象上的线程
 *
 * @date 2020/9/2812:00
 */
@Slf4j(topic = "WaitNotify")
public class WaitNotify {


    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {

            synchronized (WaitNotify.class){
                try {
                    log.info("waiting...");
                    WaitNotify.class.wait();
                    log.info("go on...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "thread");

        thread.start();
        TimeUnit.SECONDS.sleep(2);
        log.info("notify...");
        synchronized (WaitNotify.class){
            WaitNotify.class.notify();
        }
    }
}
